/***
 * @Description: 本文件是协议栈定义外部接口调用函数的头文件
 * @Author: Liverpool
 * @Date: 2024-09-05 00:29:10
 * @LastEditTime: 2024-09-05 00:29:44
 * @LastEditors: Liverpool
 */

#include "net_api.h"
#include "ipaddr.h"

#define IPV4_STR_ADD_SIZE 16 // IPV4字符串的最长字符串的个数
// 地址转换函数定义

/***
 * @description: 地址转换函数:ip地址->字符串
 * @Author: Liverpool
 * @Date: 2024-09-05 00:51:45
 * @return {*}
 * @param {x_in_addr} in 协议地址结构体
 */
char *x_inet_ntoa(struct x_in_addr in)
{
    static char buf[IPV4_STR_ADD_SIZE];
    plat_printf(buf, "%d.%d.%d.%d", in.addr0, in.addr1, in.addr2, in.addr3);
    return buf;
}

/***
 * @description: 地址转换函数:字符串->ip地址
 * @Author: Liverpool
 * @Date: 2024-09-05 00:52:29
 * @return {*}
 * @param {char} *str 协议地址字符串
 */
uint32_t x_inet_addr(const char *str)
{
    if (!str)
        return INADDR_ANY;
    D_IP_ADDR ipaddr;
    ipaddr_from_str(&ipaddr, str);
    return ipaddr.q_addr;
}

/***
 * @description: 进阶地址转换函数:ip地址->字符串
 * @Author: Liverpool
 * @Date: 2024-09-05 00:53:47
 * @return {*}
 * @param {int} family 需要转换的协议
 * @param {void} *addrptr 协议结构体的地址
 * @param {char} *strptr 字符串的地址
 * @param {size_t} len 转换的字符串长度
 */
const char *x_inet_ntop(int family, const void *addrptr, char *strptr, size_t len)
{
    if ((family != AF_INET) || !strptr || !addrptr || !len)
    {
        return (const char *)0;
    }
    struct x_in_addr *addr = (struct x_in_addr *)addrptr;
    char buf[IPV4_STR_ADD_SIZE];
    plat_printf(buf, "%d.%d.%d.%d", addr->addr0, addr->addr1, addr->addr2, addr->addr3);
    plat_strncpy(strptr, buf, len - 1);
    strptr[len - 1] = '\0';
    return strptr;
}

/***
 * @description: 进阶地址转换函数:字符串->ip地址
 * @Author: Liverpool
 * @Date: 2024-09-05 00:55:31
 * @return {*}
 * @param {int} family 需要转换的协议
 * @param {char} *strptr 字符串的地址
 * @param {void} *addrptr 协议结构体的地址
 */
int x_inet_pton(int family, const char *strptr, void *addrptr)
{
    if ((family != AF_INET) || !strptr || !addrptr)
    {
        return -1;
    }
    struct x_in_addr *addr = (struct x_in_addr *)addrptr;
    D_IP_ADDR ipaddr;
    ipaddr_from_str(&ipaddr, strptr);
    addr->s_addr = ipaddr.q_addr;
    return 0;
}